﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using TVPeruRFIDMovil.Formularios;
using TVPeruRFIDMovil.ServicioWS;
using TVPeruRFIDMovil.Clases.Negocio;
using LH.Library;
using TVPeruRFIDMovil.Clases.Movil;
using TVPeruRFIDMovil.Herramientas;
//using LH.Configuration;
//using System.IO;

namespace TVPeruRFIDMovil
{
    public partial class frmRegistro : frmBase
    {
        #region --- Variables y Constantes ---
        private Bien bien = null;
        #endregion

     
        #region --- Constructor ---
        public frmRegistro()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmRegistro_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscarBien();
        }
        private void mnuGrabar_Click(object sender, EventArgs e)
        {
            grabarTag();
        }
        private void mnuSalir_Click(object sender, EventArgs e)
        {
            salir();
        }      
        #endregion

        #region --- Eventos LectorRFID ---
        protected override void OnInicioCapturaData()
        {
            // Estableciendo propiedades de buscando
            this.pnlAlerta.BackColor = Color.Yellow;
            this.lblAlerta.Text = "Buscando...";

            // Mostrar panel de busqueda
            this.pnlAlerta.Visible = true;
            this.pnlAlerta.BringToFront();
            this.pnlAlerta.Refresh();
        }

        protected override void OnCapturaData(LH.PsionRFID.Tag tag)
        {
            // Validar que sea una etiqueta con la cabecera de irtp
            if (MetodosAplicacion.esEtiquetaValida(tag.Epc))
            {
                procesarLectura(tag.Epc);
            }
        }

        protected override void OnFinCapturaData(LH.PsionRFID.ListaTag listaTag)
        {
            if (this.pnlAlerta.BackColor.Equals(Color.Yellow))
            {
                this.pnlAlerta.Visible = false;
                this.pnlAlerta.Refresh();
            }
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                MetodosAplicacion.configuraFormulario(this);

                this.txtCodBarrasBien.Focus();
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, "Registrar Bien");
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private bool validarBusqueda()
        {
            this.txtCodBarrasBien.Text = this.txtCodBarrasBien.Text.Trim();

            if (this.txtCodBarrasBien.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtCodBarrasBien, "Debe ingresar código de barras de bien a registrar");
                return true;
            }

            return false;
        }


        private void buscarBien()
        {
            // Ocultando mostrar de busqueda
            this.pnlAlerta.Visible = false;

            // Validando campos de entrada
            if (validarBusqueda()) { return; }

            // Validando si el bien existe
            if (!ejecutarBusqueda())
            {
                this.txtCodBarrasBien.Focus();
                this.txtCodBarrasBien.SelectAll();
                return;
            }

            this.txtCodBarrasBien.ReadOnly = true;

            this.txtCodBarrasBien.BackColor = Color.Yellow;

            this.txtDescripcionBien.Text = this.bien.descripcion;
        }

        private bool ejecutarBusqueda()
        {
            bool resultado = false;
            Bien[] listaBien = null;
            Etiqueta etiqueta = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo campo del bien a buscar por código de barra
                etiqueta = new Etiqueta();

                etiqueta.bien = new Bien();
                etiqueta.bien.codBarra = this.txtCodBarrasBien.Text;

                using (Interfase interfase = new Interfase())
                {
                    listaBien = interfase.buscarBienEtiqueta(etiqueta);
                }

                // Validar si se encontro bien a buscar
                if (listaBien != null && listaBien.Length > 0)
                {
                    // Validar que solo haya un bien
                    if (listaBien.Length == 1)
                    {
                        // Estableciendo bien a buscar
                        this.bien = listaBien[0];

                        // bien encontrado OK
                        resultado = true;
                    }
                    else
                    {
                        Util.ShowMessageboxInfo("Se han encontrado mas un bien asociado al mismo código de barra por favor verificar");
                    }
                }
                else
                {
                    Util.ShowMessageboxExclamacion("no se encontró bien relacionado");
                }
            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

            return resultado;
        }


        private bool validarEntradaCompleta()
        {
            this.txtCodBarrasBien.Text = this.txtCodBarrasBien.Text.Trim();
            this.txtDescripcionBien.Text = this.txtDescripcionBien.Text.Trim();

            if (this.txtCodBarrasBien.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtCodBarrasBien, "Debe ingresar el Número del Bien");
                return true;
            }

            if (this.txtDescripcionBien.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtDescripcionBien, "Primero debera buscar el bien");
                return true;
            }

            return false;
        }


        private void grabarTag()
        {
            // Valida los campos ingresado, sino son validos entonces salir
            if (validarEntradaCompleta()) { return; }
            if ((this.bien.listaEtiqueta != null && this.bien.listaEtiqueta.Length > 0))
            {
                if (!mostrarMensajePregunta("Ya existe una etiqueta, desea continuar?", "Existe Etiqueta"))
                { return; }
            }
            bool resultadoRegistrar = false;
            LH.PsionRFID.Tag tagGrabado = null;
            string epcGenerado = string.Empty;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // -- Inicio Grabar Tag Bien --

                // Estableciendo la pontencia de grabado de Tags
                this.establecerPotenciaGrabado();

                // Obteniendo EPC generado para el Bien 
                epcGenerado = generarEpcBien();
                
                if (this.bien.listaEtiqueta != null && this.bien.listaEtiqueta.Length > 0)
                {
                    int cont = this.bien.listaEtiqueta.Length;
                    cont = cont + 1;

                    if (cont < 10)
                    {
                        epcGenerado = epcGenerado + "0" + Convert.ToString(cont);
                    }
                    else
                    {
                        epcGenerado = epcGenerado + Convert.ToString(cont);
                    }
                }
                else
                {
                    epcGenerado = epcGenerado + "01";

                }

                this.txtCodEPC.Text = epcGenerado;

                // Grabando Tag
                tagGrabado = ParametrosAplicacion.psionRFID.grabarTag(epcGenerado, LH.PsionRFID.PsionRFID.RFID_BANCO_MEMORIA.EPC, ParametrosAplicacion.ACCESSPWD, ParametrosAplicacion.KILLPWD);
                

                if (tagGrabado == null) { return; }

                // -- Fin Grabar Tag Bien --

                //Registrar etiquetaActual
                Etiqueta etiquetaRegistrar = new Etiqueta();
                etiquetaRegistrar.bien = new Bien();
                etiquetaRegistrar.bien.idBien = this.bien.idBien;
                etiquetaRegistrar.epc = epcGenerado;
                etiquetaRegistrar.usuarioRegistra = new Usuario();
                etiquetaRegistrar.usuarioRegistra.idUsuario = ParametrosAplicacion.USUARIO_ACTUAL.idUsuario;

                using (Interfase interfase = new Interfase())
                {
                    resultadoRegistrar = interfase.registrarBienEtiqueta(etiquetaRegistrar);
                }

                if (resultadoRegistrar)
                {
                    if (this.bien.listaEtiqueta != null && this.bien.listaEtiqueta.Length > 0)
                    {
                        this.pnlAlerta.BackColor = Color.Yellow;
                        this.lblAlerta.Text = "REGISTRADO";
                        this.pnlAlerta.Visible = true;
                    }
                    else
                    {
                        this.pnlAlerta.BackColor = Color.Green;
                        this.lblAlerta.Text = "NUEVO";
                        this.pnlAlerta.Visible = true;
                    }

                    mostrarMensajeInformacion("Tag Grabado Correctamente", this.Text);
                    
                }
                else
                {
                    mostrarMensajeExclamacion("Error al intentar grabar Tag", this.Text);
                }
            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                this.establecerPotenciaLectura();
                Cursor.Current = Cursors.Default;
            }
        }

        private String generarEpcBien()
        {
            String epc = ParametrosAplicacion.IDENTIFICADOR_CAB_ETIQUETA;

            if (this.txtCodBarrasBien.Text.Length == 6)
            {
                epc = epc + "00";
            }

            string nbien = this.txtCodBarrasBien.Text;

            for (int i = 0; i < nbien.Length; i++)
            {
                switch (nbien.Substring(i, 1))
                {
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_GUION_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_GUION_HEXA;
                            break;
                        }

                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_PUNTO_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_PUNTO_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_A_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_A_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_B_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_B_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_C_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_C_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_D_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_D_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_E_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_E_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_F_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_F_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_G_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_G_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_H_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_H_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_I_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_I_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_J_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_J_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_K_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_K_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_L_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_L_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_M_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_M_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_N_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_N_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_O_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_O_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_P_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_P_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Q_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Q_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_R_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_R_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_S_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_S_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_T_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_T_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_U_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_U_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_V_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_V_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_W_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_W_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_X_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_X_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Y_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Y_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Z_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Z_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_0_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_0_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_1_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_1_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_2_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_2_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_3_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_3_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_4_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_4_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_5_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_5_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_6_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_6_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_7_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_7_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_8_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_8_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_9_DES:
                        {
                            epc = epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_9_HEXA;
                            break;
                        }
                }
            }
            return epc;
        }


        private void procesarLectura(string epc)
        {
            // Validar que haya buscado primero el bien
            if (this.bien == null) { return; }

            bool encontrado = false;

            foreach (Etiqueta etiqueta in this.bien.listaEtiqueta)
            {
                if (etiqueta.habilitado.Equals(Constantes.ESTADO_ACTIVO))
                {
                    encontrado = etiqueta.epc.Equals(epc);
                    break;
                }
            }

            // Comparar si encontro expediente buscado
            this.pnlAlerta.BackColor = encontrado ? Color.Green : Color.Yellow;
            this.lblAlerta.Text = encontrado ? "Encontrado" : "Buscando...";
        }

        private void limpiarTodo()
        {
            this.txtCodBarrasBien.Text = string.Empty;
            this.txtDescripcionBien.Text = string.Empty;
            this.txtCodEPC.Text = string.Empty;

            
            // Estableciendo propiedades de buscando
            this.lblAlerta.Text = String.Empty;

            // Mostrar panel de busqueda
            this.pnlAlerta.Visible = false;
            this.pnlAlerta.Refresh();

            this.bien = null;

            this.txtCodBarrasBien.ReadOnly = false;
            this.txtCodBarrasBien.Focus();

        }

        private void salir()
        {
            this.Close();
        }
        #endregion

        private void btnGrabarOtro_Click(object sender, EventArgs e)
        {
            limpiarTodo();
        }

        

     

    }
        
}